package com.atguigu.daijia.order.testLock;

import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class TestServiceImpl  implements TestService{
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private RedissonClient redissonClient;
    public void testLock() {

        //0.创建锁对象
        RLock lock = redissonClient.getLock("lock1");

        //0.1 尝试加锁
        //0.1.1 lock() 阻塞等待一直到获取锁,默认锁有效期30s
        lock.lock();

        //1.先从redis中通过key num获取值  key提前手动设置 num 初始值：0
        String value = redisTemplate.opsForValue().get("num");
        //2.如果值为空则非法直接返回即可
        if (StringUtils.isBlank(value)) {
            return;
        }
        //3.对num值进行自增加一
        int num = Integer.parseInt(value);
        redisTemplate.opsForValue().set("num", String.valueOf(++num));

        //4.将锁释放
        lock.unlock();

    }
//    @Override
//    public void testLock() {
//        String uuid = UUID.randomUUID().toString();
//
//        //获取当前的锁
////        Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent("lock", "lock");
//        Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent("lock", uuid,10, TimeUnit.SECONDS);
//        if(ifAbsent){
//            String value = redisTemplate.opsForValue().get("num");
//
//            if (StringUtils.isBlank(value)){
//                return ;
//            }
//            int num=Integer.parseInt(value);
//            redisTemplate.opsForValue().set("num",String.valueOf(++num));
//
//            //释放锁
//            DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
//            String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
//// 设置lua脚本返回类型为Long
//            redisScript.setResultType(Long.class);
//            redisScript.setScriptText(script);
//            redisTemplate.execute(redisScript, Arrays.asList("lock"),uuid);
//
//        }else {
//            try {
//                Thread.sleep(100);
//                this.testLock();
//            }catch (InterruptedException e){
//                e.printStackTrace();
//            }
//        }
//    }


//    @Override
//    public void testLock() {
//        //获取当前的锁
////        Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent("lock", "lock");
//        Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent("lock", "lock",10, TimeUnit.SECONDS);
//        if(ifAbsent){
//            String value = redisTemplate.opsForValue().get("num");
//
//            if (StringUtils.isBlank(value)){
//                return ;
//            }
//            int num=Integer.parseInt(value);
//            redisTemplate.opsForValue().set("num",String.valueOf(++num));
//
//            //释放锁
//            redisTemplate.delete("lock");
//        }else {
//            try {
//                Thread.sleep(100);
//                this.testLock();
//            }catch (InterruptedException e){
//                e.printStackTrace();
//            }
//        }
//    }


}
